/*
 * Copyright 2023, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#ifndef _LS7A2000_PRIVATE_H
#define _LS7A2000_PRIVATE_H

#include <Accelerant.h>
#include <Drivers.h>
#include <PCI.h>
#include <OS.h>

// 最大支持的设备数量
#define MAX_LS7A2000_DEVICES 4

// 设备名称格式
#define DEVICE_FORMAT "ls7a2000_%04x_%04x_%02x%02x%02x"

// 驱动程序前缀
#define DRIVER_PREFIX "ls7a2000"

// 调试宏
#ifdef DEBUG
#define TRACE(x...) dprintf(DRIVER_PREFIX ": " x)
#else
#define TRACE(x...)
#endif

// 错误输出宏
#define ERROR(x...) dprintf(DRIVER_PREFIX ": " x)

// 寄存器访问宏
#define WREG32(reg, val) (*(vuint32 *)((vuint8 *)di->regs + (reg)) = (val))
#define RREG32(reg) (*(vuint32 *)((vuint8 *)di->regs + (reg)))

// 显示模式标志
#define DISPLAY_MODE_MASK 0x00000007
#define DISPLAY_MODE_640_480_60HZ 0
#define DISPLAY_MODE_800_600_60HZ 1
#define DISPLAY_MODE_1024_768_60HZ 2
#define DISPLAY_MODE_1280_1024_60HZ 3
#define DISPLAY_MODE_1440_900_60HZ 4
#define DISPLAY_MODE_1680_1050_60HZ 5
#define DISPLAY_MODE_1920_1080_60HZ 6
#define DISPLAY_MODE_1920_1200_60HZ 7

// 颜色空间标志
#define COLOR_SPACE_MASK 0x00000070
#define COLOR_SPACE_RGB15 0x00000010
#define COLOR_SPACE_RGB16 0x00000020
#define COLOR_SPACE_RGB24 0x00000030
#define COLOR_SPACE_RGB32 0x00000040

// 魔数定义
#define LS7A2000_PRIVATE_DATA_MAGIC 'LS7A'

// 光标位置结构
typedef struct
{
    uint16 x; // X坐标
    uint16 y; // Y坐标
} ls7a2000_cursor_position;

// 光标形状结构
typedef struct
{
    uint16 width;  // 宽度
    uint16 height; // 高度
    uint16 hot_x;  // 热点X坐标
    uint16 hot_y;  // 热点Y坐标
    uint8 *data;   // 光标数据
} ls7a2000_cursor_shape;

// IOCTL命令
enum
{
    LS7A2000_GET_DEVICE_INFO = B_DEVICE_OP_CODES_END + 1,
    LS7A2000_GET_EDID,
    LS7A2000_SET_DISPLAY_MODE,
    LS7A2000_GET_DISPLAY_MODE,
    LS7A2000_GET_FRAME_BUFFER_CONFIG,
    LS7A2000_SET_DPMS_MODE,
    LS7A2000_GET_DPMS_MODE,
    LS7A2000_SET_BRIGHTNESS,
    LS7A2000_GET_BRIGHTNESS,
    LS7A2000_SET_CURSOR_SHAPE,
    LS7A2000_SET_CURSOR_POSITION,
    LS7A2000_SHOW_CURSOR,
    LS7A2000_HIDE_CURSOR
};

// 共享信息结构
typedef struct
{
    area_id area;                       // 共享区域ID
    uint32 magic;                       // 魔数，用于验证
    phys_addr_t physical_frame_buffer;  // 帧缓冲物理地址
    uint8 *frame_buffer;                // 帧缓冲虚拟地址
    uint32 frame_buffer_size;           // 帧缓冲大小
    uint32 bytes_per_row;               // 每行字节数
    uint16 width;                       // 显示宽度
    uint16 height;                      // 显示高度
    uint8 bits_per_pixel;               // 每像素位数
    uint8 color_space;                  // 颜色空间
    uint32 dpms_mode;                   // DPMS模式
    uint16 current_mode;                // 当前显示模式
    uint16 max_pixel_clock;             // 最大像素时钟
    uint8 edid[128];                    // EDID数据
    bool has_edid;                      // 是否有EDID数据
    bool hardware_cursor;               // 是否支持硬件光标
    uint32 cursor_format;               // 光标格式
    uint16 cursor_width;                // 光标宽度
    uint16 cursor_height;               // 光标高度
    uint16 cursor_hot_x;                // 光标热点X坐标
    uint16 cursor_hot_y;                // 光标热点Y坐标
    uint8 *cursor_buffer;               // 光标缓冲区
    phys_addr_t physical_cursor_buffer; // 光标缓冲区物理地址
    uint32 cursor_buffer_size;          // 光标缓冲区大小
    bool cursor_visible;                // 光标是否可见
    uint16 cursor_x;                    // 光标X坐标
    uint16 cursor_y;                    // 光标Y坐标
    uint32 revision;                    // 硬件版本
    area_id regs_area;                  // 寄存器区域ID
    area_id frame_buffer_area;          // 帧缓冲区域ID
    area_id cursor_area;                // 光标区域ID
} ls7a2000_shared_info;

// 帧缓冲配置结构
typedef struct
{
    uint8 *frame_buffer;               // 帧缓冲虚拟地址
    phys_addr_t physical_frame_buffer; // 帧缓冲物理地址
    uint32 frame_buffer_size;          // 帧缓冲大小
    uint32 bytes_per_row;              // 每行字节数
    uint16 width;                      // 显示宽度
    uint16 height;                     // 显示高度
    uint8 bits_per_pixel;              // 每像素位数
    uint8 color_space;                 // 颜色空间
} ls7a2000_frame_buffer_config;

// 显示模式结构
typedef struct
{
    uint16 width;         // 显示宽度
    uint16 height;        // 显示高度
    uint16 refresh_rate;  // 刷新率
    uint8 bits_per_pixel; // 每像素位数
    uint8 color_space;    // 颜色空间
    uint32 flags;         // 标志
} ls7a2000_display_mode;

// 预定义显示模式
extern const ls7a2000_display_mode kSupportedDisplayModes[];

#endif // _LS7A2000_PRIVATE_H